import {_decorator, Component, Input, input, Node} from 'cc';

const {ccclass, property} = _decorator;

@ccclass('Car') //赛车节点
export class Car extends Component {

    //在一个节点的脚本文件中绑定新的节点
    @property(Node) // @property（类型）    节点名称:类型 =null;
    Camera_Node: Node = null;

    @property //此注解可以使该变量在编辑器界面可以编辑
    carSpeed: number = 30; //移动速度
    // 控制角色移动
    carMove = {a: false, b: false};


    // 开始函数，脚本启动执行该函数  自动执行
    start() {

    }

    // 循环函数 按帧数执行 每秒=60帧
    // 但有的设备可能帧数不足 每秒可能只能达到40帧 所以每秒执行的帧数较少 移动的速度也会较慢
    // 为弥补这种情况的发生 我们需要进行帧时间补偿 这个循环函数的参数 就是用于此的
    update(deltaTime: number) {

        // dateTime  每帧的时间
        // 1s=60帧  1帧=1/60s 1s=60*0.3
        // 1s=40帧  1帧=1/40s 1s=40*0.3
        // 如何解决节点在时间一样的情况下 由于帧数不同而造成距离不同的问题

        // 1s=60帧  1帧=1/60s 1s=60 * 1/60s * 0.3
        // 1s=40帧  1帧=1/40s 1s=40 * 1/40s * 0.3


        // this.node  获取赛车此节点
        const Car_Pos = this.node.getPosition(); //获取节点的位置

        //获取摄像机的位置
        const Camera_Pos = this.Camera_Node.getPosition();

        const Speed = this.carSpeed * deltaTime;

        if (this.carMove.a && !this.carMove.b) {
            // 如果A按键按下并且 D按键没有按下  向左移动
            Car_Pos.x = Car_Pos.x + Speed
        } else if (!this.carMove.a && this.carMove.b) {
            // 如D按键按下并且 A按键没有按下  向右移动
            Car_Pos.x = Car_Pos.x - Speed
        }

        // 修改节点位置
       const z = Car_Pos.z + Speed

        this.node.setPosition(Car_Pos.x, Car_Pos.y, z);
        this.Camera_Node.setPosition(Camera_Pos.x, Camera_Pos.y, Camera_Pos.z+ Speed);

        if (Car_Pos.z > 200) {
            this.node.setPosition(Car_Pos.x, Car_Pos.y, 0);
            this.Camera_Node.setPosition(Camera_Pos.x, Camera_Pos.y, -60);
        }

    }

    // 延迟函数  update函数执行后执行这个函数
    lateUpdate(deltaTime: number) {
    }

    // 加载函数 脚本第一个执行的函数 一般用于开始监听事件
    protected onLoad() {
        // 监听按键按下事件(监听类型,触发后执行函数，this)
        input.on(Input.EventType.KEY_DOWN, this.KeyDown, this)
        // 监听按键抬起事件(监听类型,触发后执行函数，this)
        input.on(Input.EventType.KEY_UP, this.KeyUp, this)

    }

    // 销毁函数 当组件或者节点被销毁时 执行这个函数 一般用于关闭监听事件
    protected onDestroy() {
        // 关闭监听
        input.off(Input.EventType.KEY_DOWN, null, this)
    }

    // 节点被启用/显示时自动执行函数
    onEnable() {
    }

    // 节点被禁用/隐藏时自动执行函数
    onDisable() {
    }

    /**
     * 监听按事件
     * @constructor
     * @private
     */
    private KeyDown(key): void {
        // console.log(key);
        if (key.keyCode == 65) {
            this.carMove.a = true;
        } else if (key.keyCode == 68) {
            this.carMove.b = true;
        }

    };

    /**
     * 监听抬起事件
     * @constructor
     * @private
     */
    private KeyUp(key): void {
        if (key.keyCode == 65) {
            this.carMove.a = false;
        } else if (key.keyCode == 68) {
            this.carMove.b = false;
        }

    } ;

}


